package com.edu.exam.enums.grading;

import com.edu.exam.enums.core.BaseEnum;

/**
 * 质量检查方法枚举
 *
 * 管理质量检查的方法分类，包括基于规则、基于机器学习、混合、专家判断、统计分析等
 *
 * @author System
 * @version 1.0.0
 */
public enum QualityCheckMethod implements BaseEnum {

    /**
     * 基于规则
     */
    RULE_BASED("RULE_BASED", "基于规则"),

    /**
     * 基于机器学习
     */
    ML_BASED("ML_BASED", "基于机器学习"),

    /**
     * 混合
     */
    HYBRID("HYBRID", "混合"),

    /**
     * 专家判断
     */
    EXPERT_JUDGMENT("EXPERT_JUDGMENT", "专家判断"),

    /**
     * 统计分析
     */
    STATISTICAL("STATISTICAL", "统计分析");

    private final String code;
    private final String description;

    QualityCheckMethod(String code, String description) {
        this.code = code;
        this.description = description;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 获取枚举的JSON值（使用code）
     *
     * @return 枚举代码
     */
    public String getJsonValue() {
        return code;
    }

    /**
     * 从代码创建枚举实例
     *
     * @param code 枚举代码
     * @return 对应的枚举实例，如果代码无效则返回RULE_BASED
     */
    public static QualityCheckMethod fromCode(String code) {
        if (code == null || code.trim().isEmpty()) {
            return RULE_BASED;
        }

        for (QualityCheckMethod method : values()) {
            if (method.getCode().equals(code)) {
                return method;
            }
        }
        return RULE_BASED;
    }

    /**
     * 检查是否为自动化方法
     *
     * @return true如果是自动化方法
     */
    public boolean isAutomated() {
        return this == RULE_BASED || this == ML_BASED || this == STATISTICAL;
    }

    /**
     * 检查是否需要人工参与
     *
     * @return true如果需要人工参与
     */
    public boolean requiresHumanExpertise() {
        return this == EXPERT_JUDGMENT || this == HYBRID;
    }

    /**
     * 检查是否为数据驱动方法
     *
     * @return true如果是数据驱动方法
     */
    public boolean isDataDriven() {
        return this == ML_BASED || this == STATISTICAL;
    }

    /**
     * 获取方法的复杂度等级
     * 数值越大复杂度越高
     *
     * @return 复杂度等级
     */
    public int getComplexityLevel() {
        switch (this) {
            case RULE_BASED:
                return 1;   // 基于规则最简单
            case STATISTICAL:
                return 2;   // 统计分析
            case ML_BASED:
                return 3;   // 机器学习
            case HYBRID:
                return 4;   // 混合方法
            case EXPERT_JUDGMENT:
                return 5;   // 专家判断最复杂
            default:
                return 0;
        }
    }

    /**
     * 获取方法的准确性等级
     * 数值越大准确性越高
     *
     * @return 准确性等级
     */
    public int getAccuracyLevel() {
        switch (this) {
            case RULE_BASED:
                return 2;   // 规则方法准确性较低
            case STATISTICAL:
                return 3;   // 统计分析中等
            case ML_BASED:
                return 4;   // 机器学习较高
            case HYBRID:
                return 4;   // 混合方法较高
            case EXPERT_JUDGMENT:
                return 5;   // 专家判断最高
            default:
                return 0;
        }
    }
}